home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
-
- use strict qw(subs refs);
-
- sub catsksz {
- my ($input, $seek, $siz, $output) = @_;
- my ($buf, $sz);
-
- while (($sz = sysread($input, $buf, $seek > 4096 ? 4096 : $seek))) {
- $seek -= $sz;
- last unless $seek > 0;
- }
- while (($sz = sysread($input, $buf, $siz > 4096 ? 4096 : $siz))) {
- $siz -= $sz;
- syswrite($output, $buf);
- last unless $siz > 0;
- }
- }
-
- sub main {
- my ($basename, $dir, $file) = @_;
- my %data;
-
- eval `cat $basename.cz2.pl`;
-
- die "unable to find file $file in archive $basename.cz2" unless $data{$file};
-
- # system "head < $name.cz2 -c ". ($data{$file}[0] + $data{$file}[1]) ." | tail -c ". $data{$file}[1] ."| bzip2 -d | head -c ". ($data{$file}[2] + $data{$file}[3]) ." | tail -c ". $data{$file}[3] ." > $file.from_archive";
- # system "./catsksz < $name.cz2 $data{$file}[0] $data{$file}[1] | bzip2 -d | ./catsksz $data{$file}[2] $data{$file}[3] > $file.from_archive";
-
- local *OUTPUT;
- if (open OUTPUT, "-|") {
- local *FILE;
- open FILE, $dir ? ">$dir/$file" : ">&STDOUT";
- catsksz(\*OUTPUT, $data{$file}[2], $data{$file}[3], \*FILE);
- } else {
- local *BUNZIP2;
- open BUNZIP2, "| bzip2 -d";
- local *ARCHIVE;
- open ARCHIVE, "<$basename.cz2" or die "cannot open archive $basename.bz2";
- catsksz(\*ARCHIVE, $data{$file}[0], $data{$file}[1], \*BUNZIP2);
- exec 'true';
- }
- }
-
- main(@ARGV);
-